grammar Gramatica;

tokens {
	LLAVEIZQ = '{';
	LLAVEDER = '}';
	FLECHA = ':';
	FINPROD = ';';
}

@header {
import pares.Pares;
import simbolo.*;
import actions.Actions;
}

scope Global {
	Pares pares;
}

gramatica returns [Pares pares]
scope Global;
@init {
$Global::pares = new Pares();
}
@after {
$Global::pares.mostar();
}
	:	terminales noTerminales simboloInicial listaProducciones;

terminales
	:	LLAVEIZQ listaTerminales LLAVEDER;

listaTerminales
	:	(TERMINAL)* ;

noTerminales
	:	LLAVEIZQ listaNoTerminales LLAVEDER;

listaNoTerminales
	:	NOTERMINAL*;

simboloInicial
	:	NOTERMINAL;

listaProducciones
	:	produccion*;

produccion
	:	NOTERMINAL FLECHA parteDerecha FINPROD;

parteDerecha
scope Global;
@init {
simbolo_anterior = null;
temp = null;
}
	:	(NOTERMINAL {Actions.agregarPar($Global::pares, $simbolo_anterior);}
		| TERMINAL {Actions.agregarPar($Global::pares, $simbolo_anterior);})*;

/* Reglas para el lexer */
TERMINAL
	:	'a'..'z';

NOTERMINAL
	:	'A'..'Z';

WS: (' ' | '\n' | '\r' | '\t')+ {$channel=HIDDEN;} ; // ignore whitespace
